package com.winai.launcher.manager;

import android.content.Context;

import com.ks.projectbasictools.utils.LogUtils;
import com.winai.launcher.DataSender;
import com.winai.launcher.bean.BehaviorBean;
import com.winai.launcher.bean.requestBean.UseInfoBean;
import com.winai.launcher.utils.BaseUtils;

import java.util.ArrayList;
import java.util.List;

/**
 * @author kangshao
 * @date 5/7/21
 * @desc 行为统计——艾益生业务行为统计
 * 　　　　　　　　┏┓　　　┏┓
 * 　　　　　　　┏┛┻━━━┛┻┓
 * 　　　　　　　┃　　　　　　  ┃
 * 　　　　　　　┃　　　━ 　　　┃
 * 　　　　　　　┃　＞　　　＜　┃
 * 　　　　　　　┃　　　　　　　┃
 * 　　　　　　　┃ ...　⌒　... ┃
 * 　　　　　　　┃　　　　　　　┃
 * 　　　　　　　 ┗━┓　　　 ┏━┛
 * 　　　　　　　　　┃　　　┃　Code is far away from bug with the animal protecting
 * 　　　　　　　　　┃　　　┃   神兽保佑,代码无bug
 * 　　　　　　　　　┃　　　┃
 * 　　　　　　　　　┃　　　┃
 * 　　　　　　　　　┃　　　┃
 * 　　　　　　　　　┃　　　┃
 * 　　　　　　　　　┃　　　┗━━━┓
 * 　　　　　　　　　┃　　　　　　　┣┓
 * 　　　　　　　　　┃　　　　　　　┏┛
 * 　　　　　　　　　┗┓┓┏━┳┓┏┛
 * 　　　　　　　　　　┃┫┫　┃┫┫
 * 　　　　　　　　　　┗┻┛　┗┻┛
 */
public class BehaviorStatisticsManager {
    private static BehaviorStatisticsManager mInstance;
    private DataSender dataSender;
    private Context mContext;
    private boolean isDouble = false;
    private List<BehaviorBean> cachePage = new ArrayList<>();
    /**
     * 并发条件下的锁。
     * LOCK for sync
     */
    private final String LOCK = "lock";

    public static BehaviorStatisticsManager getInstance(Context context) {
        if (mInstance == null) {
            synchronized (BehaviorStatisticsManager.class) {
                if (mInstance == null) {
                    mInstance = new BehaviorStatisticsManager(context);
                }
            }
        }
        return mInstance;
    }

    public BehaviorStatisticsManager() {
        try {
            throw new Exception("BehaviorStatisticsManager 不允许实例化");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    private BehaviorStatisticsManager(Context mContext) {
        this.mContext = mContext;
        this.dataSender = new DataSender(mContext);
    }

    /**
     * @date 5/10/21
     * @desc 进入页面
     */
    public synchronized void goInPage(String operation) {
        if (cachePage.size() % 2 != 0) {
            isDouble = false;
            cachePage.clear();
        }
        BehaviorBean behaviorBean = new BehaviorBean();
        behaviorBean.setUseTime(BaseUtils.getInitTime());
        behaviorBean.setDirection(1);//进入页面
        behaviorBean.setOperation(operation);
        cachePage.add(behaviorBean);
    }

    /**
     * @date 5/10/21
     * @desc 进入主页
     */
    public synchronized void goInMainPage() {
        if (cachePage.size() % 2 != 0) {
            String operation = cachePage.get(cachePage.size() - 1).getOperation();
            BehaviorBean behaviorBean = new BehaviorBean();
            behaviorBean.setUseTime(BaseUtils.getInitTime());
            behaviorBean.setDirection(0);//进入页面
            behaviorBean.setOperation(operation);
            cachePage.add(behaviorBean);
            isDouble = true;
            LogUtils.d("从" + operation + "页面退回主菜单页,cachePage.size() = " + cachePage.size());
            if (cachePage.size() >= 4) {
                requestService(cachePage);
                cachePage.clear();
            }
        }
    }

    /**
     * @date 5/10/21
     * @desc 请求接口
     * @param list
     */
    private void requestService(List<BehaviorBean> list) {
        synchronized (LOCK) {
            LogUtils.d("进入了lock，list.size = "+list.size());
            List<UseInfoBean> jsonData = new ArrayList<>();
            for (int i = 0; i < list.size(); i++) {
                if (i + 1 >= list.size()) {
                    break;
                }
                BehaviorBean behaviorBean = list.get(i);
                BehaviorBean behaviorBeanNext = list.get(i + 1);
                String operation = behaviorBean.getOperation();
                long duration;
                if (behaviorBean.getOperation().equals(behaviorBeanNext.getOperation())) {
                    String useTime = behaviorBean.getUseTime();
                    String useTimeNext = behaviorBeanNext.getUseTime();
                    duration = Long.parseLong(useTimeNext) - Long.parseLong(useTime);
                } else {
                    continue;
                }
                UseInfoBean mUseInfoBean = new UseInfoBean();
                mUseInfoBean.setEquipmentId(BaseUtils.getDeviceId());
                mUseInfoBean.setIp("");
                mUseInfoBean.setSerialNumber(DeviceInfoManager.getInstance(mContext).getDevice().getDeviceSNCode());
                mUseInfoBean.setUserAccount(DeviceInfoManager.getInstance(mContext).getDevice().getUserAccount());
                mUseInfoBean.setUseTime(BaseUtils.timeStamp2Date(BaseUtils.getInitTime(), "yyyy-MM-dd HH:mm:ss"));
                mUseInfoBean.setClazz(operation);
                mUseInfoBean.setPage(operation);
                mUseInfoBean.setEvent("");
                mUseInfoBean.setDuration(String.valueOf(duration));
                mUseInfoBean.setOperation(operation);
                mUseInfoBean.setOperationType(getOperationTypeFromOperation(operation));
                jsonData.add(mUseInfoBean);
            }
            dataSender.sendData(jsonData);
        }
    }

    /**
     * @date 5/10/21
     * @desc //01:健康调养；02:穴位查找；03:调养须知；04:产品问答；05:中医课程；06:趣味养生；07:名师直播；08:销售培训；09:产品中心；
     */
    private String getOperationTypeFromOperation(String operation) {
        switch (operation) {
            case "穴位查找":
                return "02";
            case "调养须知":
                return "03";
            case "产品问答":
                return "04";
            case "中医课程":
                return "05";
            case "趣味养生":
                return "06";
            case "名师直播":
                return "07";
            case "销售培训":
                return "08";
            case "产品中心":
                return "09";
            default:
                return "01";
        }
    }
}
